package cn.itcast.jd.util;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

@Component
public class HttpUtils {

    //连接池管理器
    private PoolingHttpClientConnectionManager cm;

    public HttpUtils() {
        this.cm = new PoolingHttpClientConnectionManager();
//        设置最大连接数
        this.cm.setMaxTotal(100);

//        设置每个主机最大连接数
        this.cm.setDefaultMaxPerRoute(10);
    }


//    get请求 返回页面数据
    public  String doGetHtml(String url){
//获取Httpclient对象
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(this.cm).build();
//        创建httpclient请求对象，设置url对象
        HttpGet httpGet = new HttpGet(url);

//        设置请求信息
        httpGet.setConfig(this.getConfig());
        CloseableHttpResponse response = null;

        try {
            //        使用HttpClient发起请求，获取响应
            response  = httpClient.execute(httpGet);
            //        解析结果
            if (response.getStatusLine().getStatusCode() == 200){
//                判断响应体EntityUtils是否不为空，如果不为空就可以使用EntityUtils
                if (response.getEntity() != null){
                    String content = EntityUtils.toString(response.getEntity(), "utf8");
                return  content;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (response != null){
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
//        返回空串
return  "";
    }

//    设置请求的配置信息
    private RequestConfig getConfig() {
        RequestConfig config = RequestConfig.custom().setConnectTimeout(1000)//创建连接的最长时间
                .setConnectionRequestTimeout(500)//获取时间的最长时间
                .setSocketTimeout(10000)//数据传输的最长时间
                .build();

        return  config;
    }

    //        下载图片，，返回图片名称
    public  String doGetImage(String url){

//获取Httpclient对象
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(this.cm).build();
//        创建httpclient请求对象，设置url对象
        HttpGet httpGet = new HttpGet(url);

//        设置请求信息
        httpGet.setConfig(this.getConfig());
        CloseableHttpResponse response = null;

        try {
            //        使用HttpClient发起请求，获取响应
            response  = httpClient.execute(httpGet);
            //        解析结果
            if (response.getStatusLine().getStatusCode() == 200){
//                判断响应体EntityUtils是否不为空，如果不为空就可以使用EntityUtils
                if (response.getEntity() != null){
//                   下载图片，
// 获取图片的后缀
                    String extName = url.substring(url.lastIndexOf("."));

//                    重命名图片
                    String picName = UUID.randomUUID().toString()+extName;
//                    下载图片
//                    声明outPutStream
                    OutputStream outputStream = new FileOutputStream(new File("D:\\maven\\img"+picName));
                    response.getEntity().writeTo(outputStream);
//                    返回图片名称
                    return picName;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (response != null){
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
//        下载失败返回空串
        return  "";

    }
}
